#ifndef STATISTICS_FUNC_H
#define STATISTICS_FUNC_H

#include <stdint.h>
#include "math.h"
#include "arm_neon.h"


void neon_memcpy(
	volatile uint8_t *dst, 
	volatile uint8_t *src, 
	int sz);

void arm_copy_f32(
  const float32_t * pSrc,
  float32_t * pDst,
  uint32_t blockSize);

void arm_fill_f32(
  float32_t value,
  float32_t * pDst,
  uint32_t blockSize);

void arm_mult_f32(
  const float32_t * pSrcA,
  const float32_t * pSrcB,
        float32_t * pDst,
        uint32_t blockSize);

void arm_mean_f32(
	  const float * pSrc,
	  uint32_t blockSize,
	  float * pResult);

void arm_max_f32(
		const float * pSrc,
		uint32_t blockSize,
		float * pResult,
		uint32_t * pIndex);

void arm_min_f32(
	const float * pSrc,
	uint32_t blockSize,
	float * pResult,
	uint32_t * pIndex);

void arm_rms_f32(
  const float * pSrc,
  uint32_t blockSize,
  float * pResult);

void arm_var_f32(
   const float * pSrc,
		 uint32_t blockSize,
		 float	 mean,
		 float * pResult);

void arm_std_f32(
   const float * pSrc,
		 uint32_t blockSize,
		 float	 mean,
		 float * pResult);

void arm_sqr_root_f32(
	const float * pSrc,
		uint32_t blockSize,
		float * pResult);

void arm_abs_f32(
  const float * pSrc,
		float * pDst,
		uint32_t blockSize);

float skewf_neon(
	float datary[], 
	float len, 
	float mean, 
	float std);

float kurtosisf_neon(
	float datary[], 
	float len, 
	float mean, 
	float std);

void arm_cmplx_mag_f32(
  const float32_t * pSrc,
		float32_t * pDst,
		uint32_t numSamples);

void arm_scale_f32(
  const float32_t *pSrc,
		float32_t scale,
		float32_t *pDst,
		uint32_t blockSize);

void arm_offset_f32(
  const float32_t * pSrc,
		float32_t offset,
		float32_t * pDst,
		uint32_t blockSize);


#endif

